home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / x68000.arc / SOURCE.ARC / LISTING.MOD < prev    next >
Text File  |  1986-02-11  |  5KB  |  189 lines

  1. IMPLEMENTATION MODULE Listing;
  2. (* Creates a program listing, including Addresses, Code & Source. *)
  3.  
  4.    FROM FileSystem IMPORT
  5.       File, WriteChar;
  6.  
  7.    FROM LongNumbers IMPORT
  8.       LONG, LongPut;
  9.  
  10.    FROM Parser IMPORT
  11.       TOKEN, Line;
  12.  
  13.    FROM SymbolTable IMPORT
  14.       ListSymTab;
  15.  
  16.    FROM Conversions IMPORT
  17.       ConvertCardinal;
  18.  
  19.    FROM Strings IMPORT
  20.       Length;
  21.  
  22.    IMPORT ASCII;
  23.  
  24.       
  25.    CONST
  26.       LnMAX = 55;
  27.  
  28.  
  29.    VAR
  30.       LnCnt : CARDINAL;   (* counts number of lines per page *)
  31.       PgCnt : CARDINAL;   (* count of page numbers *)
  32.  
  33.  
  34.  
  35.    PROCEDURE WriteStrF (VAR f : File; Str : ARRAY OF CHAR);
  36.    (* Writes a string to the file *)
  37.  
  38.       VAR
  39.          i : CARDINAL;
  40.          top : CARDINAL;
  41.  
  42.       BEGIN
  43.          top := HIGH (Str);
  44.          i := 0;
  45.          WHILE  (i <= top) AND (Str[i] # 0C) DO
  46.             WriteChar (f, Str[i]);
  47.             INC (i);
  48.          END;
  49.       END WriteStrF;
  50.  
  51.  
  52.  
  53.    PROCEDURE CheckPage (VAR f : File);
  54.    (* Checks if end of page reached yet -- if so, advances to next page. *)
  55.  
  56.       VAR
  57.          i : CARDINAL;
  58.          PgCntStr : ARRAY [0..6] OF CHAR;
  59.       
  60.       BEGIN
  61.          INC (LnCnt);
  62.          IF LnCnt >= LnMAX THEN
  63.             LnCnt := 1;
  64.             INC (PgCnt);
  65.             WriteChar (f, ASCII.ff);   (* Form Feed for new page *)
  66.             ConvertCardinal (PgCnt, 1, PgCntStr);   (* Print New Page Number *)
  67.             FOR i := 1 TO 60 DO
  68.                WriteChar (f, ' ');
  69.             END;
  70.  
  71.             WriteStrF (f, "Page ");
  72.             WriteStrF (f, PgCntStr);
  73.  
  74.             FOR i := 1 TO 3 DO
  75.                WriteChar (f, ASCII.cr);
  76.                WriteChar (f, ASCII.lf);
  77.             END;
  78.          END;
  79.       END CheckPage;
  80.  
  81.  
  82.  
  83.    PROCEDURE StartListing (VAR f : File);
  84.    (* Sign on messages for listing file -- initialize *)
  85.       BEGIN
  86.          WriteChar (f, ASCII.ff);   (* Start on a clean page *)
  87.  
  88.          WriteStrF (f, "                 68000 Cross Assembler");
  89.          WriteChar (f, ASCII.cr);
  90.          WriteChar (f, ASCII.lf);
  91.  
  92.          WriteStrF (f, "         Copyright (c) 1985 by Brian R. Anderson");
  93.          WriteChar (f, ASCII.cr);
  94.          WriteChar (f, ASCII.lf);
  95.  
  96.          WriteChar (f, ASCII.cr);
  97.          WriteChar (f, ASCII.lf);
  98.  
  99.          LnCnt := 1;
  100.          PgCnt := 1;
  101.       END StartListing;
  102.  
  103.  
  104.  
  105.    PROCEDURE WriteListLine (VAR f : File;
  106.                             AddrCnt, ObjOp, ObjSrc, ObjDest : LONG;
  107.                                nA,     nO,    nS,     nD    : CARDINAL);
  108.    (* Writes one line to the Listing file, Including Object Code *)
  109.  
  110.       CONST
  111.          ObjMAX = 30;
  112.  
  113.       VAR
  114.          i : CARDINAL;
  115.  
  116.       BEGIN
  117.          IF nA = 0 THEN   (* nA is always either 0 or 6.  Address field = 8 *)
  118.             FOR i := 1 TO 8 DO
  119.                WriteChar (f, ' ');
  120.             END;
  121.          ELSE
  122.             LongPut (f, AddrCnt, 6);
  123.             WriteChar (f, ' ');   
  124.             WriteChar (f, ' ');
  125.          END;
  126.          LongPut (f, ObjOp, nO);   
  127.          LongPut (f, ObjSrc, nS);  
  128.          LongPut (f, ObjDest, nD); 
  129.          i := 8 + nO + nS + nD;
  130.          WHILE i < ObjMAX DO
  131.             WriteChar (f, ' ');
  132.             INC (i);
  133.          END;
  134.  
  135.          WriteStrF (f, Line);
  136.          WriteChar (f, ASCII.cr);
  137.          WriteChar (f, ASCII.lf);
  138.          
  139.          CheckPage (f);
  140.       END WriteListLine;
  141.  
  142.  
  143.  
  144.    PROCEDURE WriteSymTab (VAR f : File; NumSym : CARDINAL);
  145.    (* Lists symbol table in alphabetical order *)
  146.  
  147.       VAR
  148.          Label : TOKEN;
  149.          Value : LONG;
  150.          i, j, pos : CARDINAL;
  151.  
  152.       BEGIN
  153.          LnCnt := 1;
  154.          INC (PgCnt);
  155.  
  156.          WriteStrF (f, "             * * *  Symbolic Reference Table  * * *");
  157.          FOR i := 1 TO 3 DO
  158.             WriteChar (f, ASCII.cr);
  159.             WriteChar (f, ASCII.lf);
  160.          END;
  161.  
  162.          pos := 1;
  163.          FOR i := 1 TO NumSym DO
  164.             ListSymTab (i, Label, Value);
  165.             WriteStrF (f, Label);
  166.             FOR j := Length (Label) TO 8 DO
  167.                WriteChar (f, ' ');
  168.             END;
  169.             WriteStrF (f, " : ");
  170.             LongPut (f, Value, 8);
  171.             INC (pos);
  172.             IF pos > 3 THEN
  173.                pos := 1;
  174.                WriteChar (f, ASCII.cr);
  175.                WriteChar (f, ASCII.lf);
  176.                CheckPage (f);
  177.             ELSE
  178.                WriteStrF (f, "  |  ");
  179.             END;
  180.          END; 
  181.  
  182.          WriteChar (f, ASCII.cr);
  183.          WriteChar (f, ASCII.lf);
  184.          WriteChar (f, ASCII.ff);
  185.       END WriteSymTab;
  186.  
  187. END Listing.
  188.  
  189.